CREATE procedure amsp_TreeMove
@InSourceNodeID numeric,
@InDestNodeID numeric
AS
BEGIN
Declare
@HighSortOrder numeric,
@LowSortOrder numeric,
@SortIncrement numeric,
@NewSortOrder numeric,
@DestSortOrder numeric,
@DestDepth numeric,
@DestParentID numeric,
@DestAncestorID numeric,
@SourceSortOrder numeric,
@SourceDepth numeric,
@SourceParentID numeric,
@SourceAncestorID numeric,
@MaxRelativeSort numeric,
@TotalSortSpace numeric,
@Counter int
IF @InSourceNodeID != @InDestNodeID BEGIN
BEGIN TRANSACTION
SELECT
@DestSortOrder = SortOrder,
@DestDepth = CategoryDepth,
@DestParentID = ParentNavMenuID,
@DestAncestorID = AncestorNavMenuID
FROM
Nav_Menu
WHERE
NavMenuID = @InDestNodeID
SELECT
@SourceSortOrder = SortOrder,
@SourceParentID = ParentNavMenuID,
@SourceAncestorID = AncestorNavMenuID,
@SourceDepth = CategoryDepth
FROM
Nav_Menu
WHERE
NavMenuID = @InSourceNodeID
IF @DestDepth > 1 BEGIN
UPDATE
Nav_Menu
SET
ParentNavMenuID = @DestParentID,
AncestorNavMenuID = @DestAncestorID,
CategoryDepth = @DestDepth
WHERE
NavMenuID = @InSourceNodeID
END
ELSE BEGIN
UPDATE
Nav_Menu
SET
ParentNavMenuID = @InSourceNodeID,
AncestorNavMenuID = @DestAncestorID,
CategoryDepth = @DestDepth
WHERE
NavMenuID = @InSourceNodeID
END
SELECT
@HighSortOrder = IsNULL(MIN(SortOrder), 0)
FROM
Nav_Menu
WHERE
CategoryDepth <= @DestDepth AND
SortOrder > @DestSortOrder
IF @HighSortOrder = 0
SELECT
@HighSortOrder = MAX(SortOrder) + 10
FROM
Nav_Menu
SELECT
@LowSortOrder = MAX(SortOrder)
FROM
Nav_Menu
WHERE
SortOrder < @HighSortOrder
SET @NewSortOrder = @LowSortOrder + .1 * (@HighSortOrder - @LowSortOrder)
UPDATE
Nav_Menu
SET
SortOrder = @NewSortOrder
WHERE
NavMenuID = @InSourceNodeID
create table #temp (NavMenuID numeric, RelativeSort numeric, RelativeDepth numeric)
INSERT INTO #temp VALUES (@InSourceNodeID, 0, 0)
SET @Counter = 0
WHILE @@rowCount > 0 and @Counter < 50 BEGIN
SET @Counter = @Counter + 1
INSERT INTO #temp (NavMenuID, RelativeSort, RelativeDepth)
SELECT a.NavMenuID, a.SortOrder - @SourceSortOrder, a.CategoryDepth - @SourceDepth
FROM Nav_Menu a, #temp b
WHERE a.ParentNavMenuID = b.NavMenuID
and a.NavMenuID not in (SELECT NavMenuID FROM #temp)
END
SELECT @MaxRelativeSort = MAX(RelativeSort) from #temp
SET @TotalSortSpace = @HighSortOrder - @NewSortOrder
UPDATE Nav_Menu
SET AncestorNavMenuID = @SourceAncestorID,
CategoryDepth = (select @DestDepth + t.RelativeDepth
from #temp t
where t.NavMenuID = NavMenu.NavMenuID),
SortOrder = (select @NewSortOrder + ((t.RelativeSort / @MaxRelativeSort) * @TotalSortSpace)
from #temp t
where t.NavMenuID = NavMenu.NavMenuID)
WHERE
NavMenuID in (select NavMenuID from #temp) AND
NavMenuID != @InSourceNodeID
COMMIT TRANSACTION
END
END
GO
GRANT EXECUTE ON [dbo].[amsp_TreeMove] TO [IMIS]
GO